home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / share / python-support / python-rdflib / rdflib / syntax / NamespaceManager.py < prev    next >
Encoding:
Python Source  |  2007-04-04  |  3.9 KB  |  111 lines

  1. from __future__ import generators
  2.  
  3. from rdflib import URIRef, Literal, RDFS, Variable
  4. from rdflib.syntax.xml_names import split_uri
  5.  
  6. from urlparse import urljoin, urldefrag
  7. from urllib import pathname2url, url2pathname
  8. import os, sys, new
  9.  
  10.  
  11. class NamespaceManager(object):
  12.     def __init__(self, graph):
  13.         self.graph = graph
  14.         self.__cache = {}
  15.         self.__log = None
  16.         self.bind("xml", u"http://www.w3.org/XML/1998/namespace")
  17.         self.bind("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#")
  18.         self.bind("rdfs", "http://www.w3.org/2000/01/rdf-schema#")
  19.  
  20.     def reset(self):
  21.         self.__cache = {}
  22.  
  23.     def __get_store(self):
  24.         return self.graph.store
  25.     store = property(__get_store)
  26.  
  27.     def qname(self, uri):
  28.         prefix, namespace, name = self.compute_qname(uri)
  29.         if prefix=="":
  30.             return name
  31.         else:
  32.             return ":".join((prefix, name))
  33.  
  34.     def normalizeUri(self,rdfTerm):
  35.         """
  36.         Takes an RDF Term and 'normalizes' it into a QName (using the registered prefix)
  37.         or (unlike compute_qname) the Notation 3 form for URIs: <...URI...> 
  38.         """
  39.         try:
  40.             namespace, name = split_uri(rdfTerm)
  41.             namespace = URIRef(namespace)
  42.         except:
  43.             if isinstance(rdfTerm,Variable):
  44.                 return "?%s"%rdfTerm
  45.             else:
  46.                 return "<%s>"%rdfTerm
  47.         prefix = self.store.prefix(namespace)
  48.         if prefix is None and isinstance(rdfTerm,Variable):
  49.             return "?%s"%rdfTerm
  50.         elif prefix is None:
  51.             return "<%s>"%rdfTerm
  52.         else:
  53.             qNameParts = self.compute_qname(rdfTerm)         
  54.             return ':'.join([qNameParts[0],qNameParts[-1]])    
  55.  
  56.     def compute_qname(self, uri):
  57.         if not uri in self.__cache:
  58.             namespace, name = split_uri(uri)
  59.             namespace = URIRef(namespace)
  60.             prefix = self.store.prefix(namespace)
  61.             if prefix is None:
  62.                 prefix = "_%s" % len(list(self.store.namespaces()))
  63.                 self.bind(prefix, namespace)
  64.             self.__cache[uri] = (prefix, namespace, name)
  65.         return self.__cache[uri]
  66.  
  67.     def bind(self, prefix, namespace, override=True):
  68.         namespace = URIRef(namespace)
  69.         # When documenting explain that override only applies in what cases
  70.         if prefix is None:
  71.             prefix = ''
  72.         bound_namespace = self.store.namespace(prefix)
  73.         if bound_namespace and bound_namespace!=namespace:
  74.             # prefix already in use for different namespace
  75.             #
  76.             # append number to end of prefix until we find one
  77.             # that's not in use.
  78.             if not prefix:
  79.                 prefix = "default"
  80.             num = 1
  81.             while 1:
  82.                 new_prefix = "%s%s" % (prefix, num)
  83.                 if not self.store.namespace(new_prefix):
  84.                     break
  85.                 num +=1
  86.             self.store.bind(new_prefix, namespace)
  87.         else:
  88.             bound_prefix = self.store.prefix(namespace)
  89.             if bound_prefix is None:
  90.                 self.store.bind(prefix, namespace)
  91.             elif bound_prefix == prefix:
  92.                 pass # already bound
  93.             else:
  94.                 if override or bound_prefix.startswith("_"): # or a generated prefix
  95.                     self.store.bind(prefix, namespace)
  96.  
  97.     def namespaces(self):
  98.         for prefix, namespace in self.store.namespaces():
  99.             namespace = URIRef(namespace)
  100.             yield prefix, namespace
  101.  
  102.     def absolutize(self, uri, defrag=1):
  103.         base = urljoin("file:", pathname2url(os.getcwd()))
  104.         result = urljoin("%s/" % base, uri, allow_fragments=not defrag)
  105.         if defrag:
  106.             result = urldefrag(result)[0]
  107.         if not defrag:
  108.             if uri and uri[-1]=="#" and result[-1]!="#":
  109.                 result = "%s#" % result
  110.         return URIRef(result)
  111.